/**
* Agente aspirador para um grid com duas ou + posicoes verticais e horizontais.
* O ambiente eh estatico: as posicoes das sujeiras sao sorteadas no inicio
* (quando o ambiente eh inicializado) e o robo persegue o objetivo de limpa-las.
*/

/* CRENCAS INICIAIS - BELIEFS*/
larguraGrid(1). // vai ser sobreposta pelo valor colocado no ambiente
alturaGrid(1).  // no inicio, recebe uma percepcao que dispara um plano
direcao(direita). //

// regras para bloqueio - agente nas posicoes limites do grid
bloqueadoNaParedeDir :- estouEm(X, Y) & larguraGrid(X).
bloqueadoNaParedeEsq :- estouEm(X, Y) & X=0.
bloqueadoNaParedeSup :- estouEm(X, Y) & Y=0.
bloqueadoNaParedeInf :- estouEm(X, Y) & alturaGrid(Y).


/* DESEJO ou OBJETIVO INICIAL - DESIRES 
* o simbolo ! significa que o que vem a seguir eh um desejo que pode se
* tornar uma intencao se o agente se comprometer em executa-lo. Tambem
* pode ser chamado de objetivo. Este agente nao possui objetivo inicial, ele
* aguarda o recebimento da percepcao tamanho do grid para incluir o objetivo
* de limpar.
*/


/* PLANOS E INTENCOES: em Jason tem a forma
 * <evento_disparo> : <condicao> <- <corpo do plano>
 * +!limpar(celulas): represente o evento de que o agente adquiriu o desejo
 * de !limpar(celulas) - dai o simbolo +)
 *
 * De fato, !limpar(celulas) eh um desejo que pode se tornar uma intencao se o 
 * agente escolher executar o plano. Para tal, a <condicao> deve ser satisfeita 
 * para que o plano em questao seja relevante (elegivel para ser executado).
 */
 
 /* 
 * O plano tg  adiciona duas crencas no evento de recebimento da percepcao
 * que sinaliza o tamanho do grid (para evitar calculos em outros planos): 
 * 1. largura maxima do Grid e
 * 2. altura maxima do Grid. 
 * Em seguida, adiciona o objetivo de limpar.
 */

+tamGrid(asp, X, Y): true <-
    -+larguraGrid(X-1); 
	-+alturaGrid(Y-1);
	!limpar.
/* 
 * O plano eh disparado a cada recebimento da percepcao que diz onde o
 * o aspirador se encontra. 
 */
  
+pos(asp, X, Y) : true <-
  -+estouEm(X, Y).
  
+!limpar: lixo(asp) <-
  aspirar(celula);
  .print("Atingi o objetivo").
  
+!limpar: not lixo(asp) <-
  !calcularProxMovimento;
  !limpar.

+!calcularProxMovimento : bloqueadoNaParedeDir & direcao(direita) <-
  -+direcao(esquerda);
  baixo(celula).

  
+!calcularProxMovimento : bloqueadoNaParedeEsq & direcao(esquerda) <-
  -+direcao(direita);
  baixo(celula).
  
+!calcularProxMovimento : direcao(direita) <-
  dir(celula).
  
+!calcularProxMovimento : direcao(esquerda) <-
  esq(celula).

    

